<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8" />
		<title>姓名案例_watch实现</title>
		<!-- 引入Vue -->
		<script type="text/javascript" src="../node_modules/vue/dist/vue.js"></script>
	</head>
	<body>
		<!-- 
			computed和watch之间的区别：
				1.computed能完成的功能，watch都可以完成。
				2.watch能完成的功能，computed不一定能完成，例如：watch可以进行异步操作。
			两个重要的小原则（目的是为了保证函数中的 this 指向的是 vm 对象）：
				1.所被 Vue 管理的函数，最好写成普通函数，这样 this 的指向才是 vm 或 组件实例对象。
				2.所有不被 Vue 所管理的函数（定时器的回调函数、ajax 的回调函数等、Promise的回调函数），最好写成箭头函数，这样this的指向才是vm 或 组件实例对象。
				  箭头函数自身没有 this，所以它会去外层空间找 this 对象，如果找到了的话，就会将外层的 this 看做是自己的 this。
		-->
		<!-- 准备好一个容器-->
		<div id="root">
			姓：<input type="text" v-model="firstName"> <br/><br/>
			名：<input type="text" v-model="lastName"> <br/><br/>
			全名：<span>{{fullName}}</span> <br/><br/>
		</div>
	</body>

	<script type="text/javascript">
		Vue.config.productionTip = false; //阻止 vue 在启动时生成生产提示。

		const vm = new Vue({
			el:'#root',
			data:{
				firstName:'张',
				lastName:'三',
				fullName:'张-三'
			},
			watch:{
				firstName(val){
					// 隔了 1s 之后才开始修改 fullName
					// 定时器的回调函数不归 vue 管理，又因为它使用箭头函数，自身没有 this，所以到外层函数中去找，
					// 也就是会到 firstName 函数中去找 this，从而将 vue 实例作为自己的 this 对象
					// 如果定时器的回调函数使用的直接是 function 函数，那么 this 直接为 window 对象
					setTimeout(()=>{
						console.log(this);
						this.fullName = val + '-' + this.lastName;
					},1000);
				},
				lastName(val){
					this.fullName = this.firstName + '-' + val;
				}
			}
		})
	</script>
</html>